% 默认页面大小 4:3
% \documentclass[10pt]{ctexbeamer}
% 页面大小 16:10
% \documentclass[10pt, aspectratio=1610]{ctexbeamer}
% 页面大小 16:9
\documentclass[10pt, aspectratio=169]{ctexbeamer}
% 页面大小 14:9
% \documentclass[10pt, aspectratio=149]{ctexbeamer}
% 页面大小 1.41:1
% \documentclass[10pt, aspectratio=141]{ctexbeamer}
% 页面大小 5:4
% \documentclass[10pt, aspectratio=54]{ctexbeamer}
% 页面大小 3:2
% \documentclass[10pt, aspectratio=32]{ctexbeamer}

\usetheme[logo=UCAS, sublogo=UCAS]{ucas}
% logo 的选项: CAS, UCAS
% sublogo 的选项: AMSS, AMSS2018, UCAS

% 引入参考文献列表的 .bib 文件, 使用 GB/T 7714-2015 的文献著录规则.
\usepackage[backend=biber, style=gb7714-2015]{biblatex}
\usepackage{listings}
\addbibresource{ref.bib}

\title[高级操作系统课程期末汇报]{高级操作系统课程期末汇报}
\subtitle[容器时序检查点保护]{容器时序检查点保护}
\author[姚益祁、王春祥、李小龙]{\href{mailto:timwcx@qq.com}{姚益祁、王春祥、李小龙}}
\date[\today]{\today, 中国南京}
\subject{容器时序检查点保护}
\keywords{iSula, osCourse}

\begin{document}

\begin{frame}[plain]
  \maketitle
\end{frame}

\begin{frame}{实验要求}
  \begin{block}{实验内容}
  \begin{itemize}
    \item 在K8S平台上基于iSulad搭建容器集群，并使用容器检查点恢复功能
    \item 设计实现容器多设备下时序检查点-恢复方案
  \end{itemize}
\end{block}
\begin{block}{评分标准}
  \begin{itemize}
    \item 搭建以iSulad为容器引擎的K8S容器编排平台编译安装iSulad指定pr并安装criu组件，实现检查点恢复功能
    \item 搭建k8s容器集群，并使用容器检查点创建及恢复功能
    \item 实现容器检查点时序保存恢复方案，并通过自动化脚本实现检查点周期的动态调整容器负载动态变化下“检查点保存”对于负载性能、系统能耗、资源占用的影响也动态变化，根据不同目标实现检查点间隔的动态调整。
    \item 书面\&口头实验报告
  \end{itemize}
\end{block}
\end{frame}

\begin{frame}[t]
  \frametitle{目录}
  \tableofcontents
\end{frame}

\section[编译安装iSulad指定pr并安装criu组件]{编译安装iSulad指定pr并安装criu组件}

\begin{frame}{iSulad仓库}
  \begin{columns}
    \column{0.8\textwidth}
    \begin{figure}
      \includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/iSulad_build/isulad_criu.png}
    \end{figure}
    \href{https://gitee.com/liuxu180400617/iSulad/tree/master\_criu/}{https://gitee.com/liuxu180400617/iSulad/tree/maste\_criu/}
  \end{columns}
\end{frame}

\begin{frame}{LCR仓库}
  \begin{columns}
    \column{0.8\textwidth}
    \begin{figure}
      \includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/iSulad_build/lcr.png}
    \end{figure}
    \href{https://gitee.com/liuxu180400617/lcr}{https://gitee.com/liuxu180400617/lcr}
  \end{columns}
\end{frame}

\begin{frame}{编译过程}
  \begin{block}{编译过程}
    dnf builddep iSulad.spec \\ 
    mkdir build \& cd build \\
    cmake -DENABLE\_CRI\_API\_V1=ON .. 
  \end{block}
  \begin{figure}
    \includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/iSulad_build/build_isula.png}
  \end{figure}
\end{frame}

\begin{frame}{编译安装iSulad指定pr并安装criu组件}
    \begin{figure}
      \includegraphics[width=.8\textwidth, height=.8\textheight, keepaspectratio]{./figures/iSulad_build/isulad_run.png}
    \end{figure}
\end{frame}

\section[搭建k8s容器集群]{搭建kas容器集群}

\begin{frame}{搭建k8s容器集群}
  \begin{block}{环境准备}
    服务器环境：使用OpenEuler22.03的\textbf{单节点}华为云服务器\\

    总共需要如下几步
    \begin{enumerate}
      \item 代理环境配置
      \item 网络配置
      \item k8s安装
      \item CNI插件安装
    \end{enumerate}
    
  \end{block}
\end{frame}

\begin{frame}{代理环境配置}
  镜像源无法使用可以以端口转发的方式将本地代理转发到服务器上
  \begin{block}{SSH端口转发}
    ssh -R 20172:127.0.0.1:20172 root@xxx.xxx.xxx.xx
  \end{block}
  在服务器上使用环境变量即可对shell进行代理
  \begin{block}{shell配置}
    export http\_proxy=http://127.0.0.1:20172 \\
    export https\_proxy=http://127.0.0.1:20172
  \end{block}
\end{frame}

\begin{frame}{网络配置}
  \begin{columns}
    \column{0.3\textwidth}
    内容较多，只展示大致步骤：
    \begin{enumerate}
      \item 关闭防火墙
      \item 禁用selinux
        \begin{block}{bash}
          setenforce 0
        \end{block}
      \item 关闭swap
      \item 配置网络转发机制
      \item 启用overlay和br\_netfilter内核模块
        \begin{block}{bash}
          modprobe overlay \\
          modprobe br\_netfilter
        \end{block}
    \end{enumerate}
    \column{0.7\textwidth}
    \begin{figure}
      \includegraphics[width=\textwidth, height=\textheight, keepaspectratio]{./figures/k8s_install/k8s_set.png}
    \end{figure}
  \end{columns}
\end{frame}

\begin{frame}{k8s安装}
  \begin{columns}
    \column{0.3\textwidth}
    即使设置了代理配置，这里仍需配置镜像源    
    完成镜像源配置即可使用如下命令安装：
    \begin{block}{安装命令}
      yum install -y kubelet kubeadm kubectl --disableexcludes=kubernets
    \end{block}
    \column{0.7\textwidth}
    \begin{figure}
      \includegraphics[width=\textwidth, height=\textheight, keepaspectratio]{./figures/k8s_install/yum_install.png}
    \end{figure}
  \end{columns}
\end{frame}

\begin{frame}{搭建k8s容器集群}
  需要启用checkpoint功能，故而不能使用常规的k8s安装方法\\
  需要一个额外配置文件：
  \begin{block}{kubeadm-config.yaml}
    \# 这里只提供大致内容\\
    apiVersion: kubeadm.k8s.io/v1beta3\\
    kind: InitConfiguration\\
    nodeRegistration:\\
      criSocket: ``unix:///var/run/isulad.sock''\\
    ---\\
    apiVersion: kubelet.config.k8s.io/v1beta1\\
    kind: KubeletConfiguration\\
    featureGates:\\
      ContainerCheckpoint: true\\
  \end{block}
\end{frame}

\begin{frame}{CNI插件安装}
  安装Calico需要对应确定k8s的版本，当前安装的是v1.26的k8s，故calico应该为3.26
  \begin{block}{bash}
    kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
  \end{block}
  如果之前安装过k8s，并没有在删除k8s之前删除CNI的Pod，则可能会安装失败\\
  届时，可以使用如下命令解决
  \begin{block}{bash}
    kubectl delete pods --all --all-namespaces
  \end{block}
\end{frame}

\section[实现容器检查点时序保存恢复方案]{实现容器检查点时序保存恢复方案}

\begin{frame}{容器检查点创建}
  \begin{block}{容器检查点创建}
      kubectl apply -f nginx.yaml

      curl -sk -X POST  "https://localhost:10250/checkpoint/default/nginx-deployment-85996f8dbd-4b4zm/nginx" \\
      --key /etc/kubernetes/pki/apiserver-kubelet-client.key \\
      --cacert /etc/kubernetes/pki/ca.crt \\
      --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt
  \end{block}
  \begin{figure}
    \includegraphics[width=.7\textwidth, height=.7\textheight, keepaspectratio]{./figures/k8s_checkpoint.png}
  \end{figure}
\end{frame}

\begin{frame}{实现容器检查点时序保存恢复方案1-docker build方案}
\begin{columns}
  \column{0.4\textwidth}
  \begin{figure}
    \includegraphics[width=.85\textwidth, height=.85\textheight, keepaspectratio]{./figures/check_checkpoint_inner.png}
  \end{figure}  
  \column{0.6\textwidth}
  \begin{block}{Docerfile}
    \# scratch是空的镜像,表示容器镜像构建仅从检查点tar文件夹开始

    FROM scratch

    ADD webserver.tar .

    \# webserver.tar 应该替换为你需要的tar文件,建议将/var/lib/kubelet/checkpoints文件夹的检查点tar文件拷贝一份到当前文件夹
  \end{block}
\end{columns}
\end{frame}

\begin{frame}{实现容器检查点时序保存恢复方案2-iSulad原生方案}
  \begin{figure}
    \includegraphics[width=.7\textwidth, height=.7\textheight, keepaspectratio]{./figures/create_checkpoint_source.png}
  \end{figure}
\end{frame} 

\begin{frame}{实现容器检查点时序保存恢复方案2-iSulad原生方案}
  \begin{figure}
    \includegraphics[width=.7\textwidth, height=.7\textheight, keepaspectratio]{./figures/crictl.png}
  \end{figure}
\end{frame}

\begin{frame}{实现容器检查点时序保存恢复方案3-crik}
  \begin{figure}
    \includegraphics[width=.7\textwidth, height=.7\textheight, keepaspectratio]{./figures/crik.png}
  \end{figure}
\end{frame}

\begin{frame}{实现容器检查点时序保存恢复方案3-crik}
  \begin{columns}
    \column{0.5\textwidth}
    \begin{block}{bash}
      \# 启动容器\\
      kubectl apply -f examples/simple-loop.yaml\\
      \# 查看容器日志（每秒自增1）\\
      kubectl logs -f simple-loop-0\\
      \# 删除该pod（模拟崩溃）\\
      kubectl delete pod simple-loop-0\\
      \# 再次查看容器日志\\
      kubectl logs -f simple-loop-0
    \end{block}
    \column{0.5\textwidth}
    \begin{figure}
      \includegraphics[width=\textwidth, height=\textheight, keepaspectratio]{./figures/iSulad_build/crik.png}
    \end{figure}
  \end{columns}
\end{frame}

\begin{frame}{实现容器的周期性快照保存}
  \begin{figure}
    \includegraphics[width=.7\textwidth, height=.7\textheight, keepaspectratio]{./figures/checkpoint_py.png}
  \end{figure}
\end{frame}

\begin{frame}{实现容器的周期性快照保存}
  \begin{columns}
  \column{0.9\textwidth}
  每隔30s对一个容器进行快照保存
  \begin{figure}
    \includegraphics[width=.9\textwidth, height=.9\textheight, keepaspectratio]{./figures/checkpoint_save.png}
  \end{figure}
  \begin{block}{下一步的计划}
    通过k8s client python sdk获取pods的事件以及运行状态，根据运行状态动态调整快照保存的周期
  \end{block}
  \end{columns}
\end{frame}


\begin{frame}[plain]
  \vfill
  \centerline{\Huge 谢谢}
  \vfill
\end{frame}

\end{document}
